package org.example.subside.Map;

import java.util.Map;
import java.util.Set;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 使用concurrenthashmap做缓存，配合定时任务，定时清理不在使用的key，线程安全
 */
public class LocalCache {

    /**
     * 默认缓存时长 单位s
     */
    private static final int DEFAULT_TIMEOUT = 3600;
    /**
     * 默认缓存容量
     */
    private static final int DEFAULT_SIZE = 1000;

    /**
     * 存储数据
     */
    private static final Map<String, Object> data;

    private static final ScheduledExecutorService executorService;

    //初始化
    static {
        data = new ConcurrentHashMap<>(DEFAULT_SIZE);
        executorService = new ScheduledThreadPoolExecutor(2);
    }

    /**
     * 私有化构造函数
     */
    private LocalCache() {
    }

    /**
     * 增加缓存 默认有效时长
     *
     * @paramkey
     * @paramvalue
     */
    public static void put(String key, Object value) {
        data.put(key, value);
        //定时器 调度任务，用于根据 时间 定时清除 对应key 缓存
        executorService.schedule(new TimerTask() {
            @Override
            public void run() {
                remove(key);
            }
        }, DEFAULT_TIMEOUT, TimeUnit.SECONDS);
    }

    /**
     * 增加缓存  并设置缓存时长 单位 s
     *
     * @paramkey
     * @paramvalue
     * @paramtimeout缓存时长 单位s
     */
    public static void put(String key, Object value, int timeout) {
        data.put(key, value);
        //lambda 替换匿名内部类
        executorService.schedule(() -> remove(key), timeout, TimeUnit.SECONDS);
    }

    /**
     * 获取缓存
     *
     * @return
     * @paramkey
     */
    public static Object get(String key) {
        return data.get(key);
    }

    /**
     * 获取当前缓存中 所有的key
     *
     * @return
     */
    public static Set<String> cacheKeys() {
        return data.keySet();
    }

    /**
     * 删除缓存
     *
     * @paramkey
     */
    public static void remove(String key) {
        data.remove(key);
    }

    /**
     * 清空所有缓存
     */
    public static void clear() {
        if (cacheKeys().size() > 0) {
            data.clear();
        }
    }
}
